package app.controller;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import app.model.ticket_reserve.Evento;
import app.model.ticket_reserve.EventosDaoImpl;
import app.model.ticket_reserve.Lugar;
import app.view.ViewReservaBilhetes;

public class ReservaBilhetes_otimista {

	public static int tempo_maximo_visualizcao = 5000;
	
	protected ViewReservaBilhetes view;
	protected EventosDaoImpl userImpl;
	protected Evento evento_selecionado = null;
	protected Lugar lugar_selecionado = null;
	protected Thread timer;
	
	public ReservaBilhetes_otimista(String title) {
		this.userImpl = new EventosDaoImpl();
		
		Vector<Evento> eventos = this.userImpl.GetEventosDisponiveis(-1);
		
		this.view = new ViewReservaBilhetes(eventos, this, title);
		this.view.setVisible(true);
	}
	
	public Vector<Evento> getListaEventosDisponiveis() {
		return this.userImpl.GetEventosDisponiveis(-1);
	}
	
	public boolean reservaBilhete() {
		if(evento_selecionado == null || lugar_selecionado == null){
			return false;
		}else{
			this.timer.interrupt();
			return this.userImpl.reservaBilhete(evento_selecionado, lugar_selecionado);
		}	
	}
	
	public Vector<Lugar> getListaLugaresDisponiveis(int tipo_do_Evento) {
		return this.userImpl.getListaLugaresDisponiveis(tipo_do_Evento, -1);
	}

	public void hideLugaresPopUp() {
		this.view.hideLugaresPopUp();
	}
	
	public boolean lugarEstaSelecionado(Evento evento, Lugar lugar){
		
		boolean result = false;

		this.evento_selecionado = evento;
		this.lugar_selecionado = lugar;
		try {
			this.userImpl.keepKey(true);
		} catch (SQLException e) {
			System.err.println("Auto commit nao foi possivel por a false.");
		}
		result = this.userImpl.bloqueiaLugarSelecionado(evento, lugar);
		this.StartTableLockTimer();
		
		return result;
		
	}
	
	public void LibertarLugarAnteriormenteSelecionado() {

		this.evento_selecionado = null;
		this.lugar_selecionado = null;
	}

	protected void StartTableLockTimer() {
		timer = new Thread(new Runnable() {
			
			@Override
			public void run() {		
				try {
					Thread.sleep(ReservaBilhetes_otimista.tempo_maximo_visualizcao);
					
					ReservaBilhetes_otimista.this.hideLugaresPopUp();

					ReservaBilhetes_otimista.this.LibertarLugarAnteriormenteSelecionado();
					
					ReservaBilhetes_otimista.this.userImpl.revertToKeepKey();
				} catch (SQLException | InterruptedException e) {
					System.err.println("O timer lock da tabela foi parado.");
				}
				
			}
		});
		timer.start();
	}

}
